/* eslint-disable no-eval */
/* eslint-disable no-param-reassign */

/**
 * 设计器全局工具栏
 */
class DesignUtilCls {
  formatDate = (date) => {
    // window.console.log(date)
    const d = new Date(date);
    const y = d.getFullYear(); // 年份
    const m = (d.getMonth() + 1).toString().padStart(2, '0'); // 月份
    const r = d.getDate().toString().padStart(2, '0'); // 日子
    const hh = d.getHours().toString().padStart(2, '0'); // 小时
    const mm = d.getMinutes().toString().padStart(2, '0'); // 分钟
    const ss = d.getSeconds().toString().padStart(2, '0'); // 秒
    return `${y}-${m}-${r} ${hh}:${mm}:${ss}`; // es6 字符串模板
  };

  showDate = (date) => {
    const timespan = new Date().getTime() - new Date(date).getTime();
    if (timespan < 1000 * 60) {
      // 1分钟
      return '1分钟内';
    }
    if (timespan < 1000 * 60 * 10) {
      // 1分钟
      return '10分钟内';
    }
    if (timespan < 1000 * 60 * 60) {
      // 1分钟
      return '1小时内';
    }
    return this.formatDate(date);
  };

  // 判断点是否在左上侧
  isLeftTopOfSize = (point, clientRect) => {
    if (clientRect == null) return false;
    // 上侧判断
    if (point.y < clientRect.y) {
      return true;
    }
    // 左侧判断
    if (point.x < clientRect.x && point.y < clientRect.y + clientRect.height) {
      return true;
    }
    // 右侧或者下侧判断
    return false;
  };

  // 获得角度
  getAngle = function (angx, angy) {
    return (Math.atan2(angy, angx) * 180) / Math.PI;
  };

  // 手势判断: 根据起点终点返回方向 1向上 2向下 3向左 4向右 0未滑动
  getDirection = function (startx, starty, endx, endy) {
    const angx = endx - startx;
    const angy = endy - starty;
    let result = 0;
    // 如果滑动距离太短
    if (Math.abs(angx) < 2 && Math.abs(angy) < 2) {
      return result;
    }
    const angle = this.getAngle(angx, angy);
    if (angle >= -135 && angle <= -45) {
      result = 1;
    } else if (angle > 45 && angle < 135) {
      result = 2;
    } else if ((angle >= 135 && angle <= 180) || (angle >= -180 && angle < -135)) {
      result = 3;
    } else if (angle >= -45 && angle <= 45) {
      result = 4;
    }
    return result;
  };

  // // 判断点是否在中心点左上侧
  // isLeftTopOfCenter = (point, clientRect) => {
  //   // 中心点上侧判断
  //   if (point.y < clientRect.y) {
  //     return true;
  //   }
  //   // 中心点左侧判断
  //   if (point.x < clientRect.x + clientRect.width / 2 && point.y < clientRect.y + clientRect.height) {
  //     return true;
  //   }
  //   // 右下侧判断
  //   return false;
  // };

  // 判断点是否在矩阵内部
  isInSize = (point, clientRect) => {
    if (clientRect == null) return false;
    // 矩阵中间
    if (
      point.x > clientRect.x &&
      point.y > clientRect.y &&
      point.x < clientRect.x + clientRect.width &&
      point.y < clientRect.y + clientRect.height
    ) {
      return true;
    }
    return false;
  };

  // 判断数据是否是${}绑定值
  isBindValue = (value) => {
    if (value instanceof String) {
      if (value.startsWith('${') && value.endsWith('}')) {
        return true;
      }
    }
    return false;
  };

  // 数组移除
  arrayRemove = function (array, o) {
    const a = array.indexOf(o);
    if (a >= 0) {
      array.splice(a, 1);
      return true;
    }
    return false;
  };

  // 数组交换
  arraySwap = function (arr, index1, index2) {
    arr[index1] = arr.splice(index2, 1, arr[index1])[0];
    return arr;
  };

  // json 对比
  objectEquals = function (from, to) {
    if (Object.entries(from).toString() === Object.entries(to).toString()) {
      return true;
    }
    return false;
  };

  // 唯一值
  UUID = function (length) {
    return Number(Math.random().toString().substr(3, length) + Date.now()).toString(36);
  };

  // 初始值
  initValue = (value, defaultValue) => {
    if (value === '' || value == null) {
      return defaultValue;
    }
    return value;
  };

  // 尝试转json为object
  tryParseJson = (jsonstr, defaultValue) => {
    try {
      return JSON.parse(jsonstr);
    } catch (e) {
      try {
        return eval(`(${jsonstr})`);
      } catch (e2) {
        console.warn('json格式解析错误', jsonstr);
        return defaultValue;
      }
    }
  };

  // 包含字符串
  containStr = (from, contain) => {
    if (from == null) return false;
    return from.indexOf(contain) > -1;
  };

  // 字符串结束
  endWithStr = (from, endStr) => {
    const d = from.length - endStr.length;
    return d >= 0 && from.lastIndexOf(endStr) === d;
  };

  // 数据绑定
  dataBind = (data) => {
    if (data == null) return data;
    if (Array.isArray(data)) {
      return data.map((d) => {
        return { key: `db_${this.UUID(16)}`, ...d };
      });
    } else {
      return { key: `db_${this.UUID(16)}`, ...data };
    }
  };
}
const DesignUtil = new DesignUtilCls();
export default DesignUtil;
